From 4894e08d878c74693efa87cc6f6f157a1a69b4a0 Mon Sep 17 00:00:00 2001 From: Andrew Watts Date: Fri, 21 Apr 2017 10:54:47 +0930 Subject: [PATCH] Fix non-deterministic unit dependency list generation This resulted in the flags passed to rustc having random ordering, see #3895. --- src/cargo/core/resolver/mod.rs | 6 ++++++ src/cargo/ops/cargo_rustc/context.rs | 7 ++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index 896b28046..1a3e217bf 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -200,6 +200,12 @@ unable to verify that `{0}` is the same as when the lockfile was generated Deps { edges: self.graph.edges(pkg), resolve: self } } + pub fn deps_sorted(&self, pkg: &PackageId) -> Vec<&PackageId> { + let mut deps = self.deps(pkg).collect::>(); + deps.sort(); + deps + } + pub fn deps_not_replaced(&self, pkg: &PackageId) -> DepsNotReplaced { DepsNotReplaced { edges: self.graph.edges(pkg) } } diff --git a/src/cargo/ops/cargo_rustc/context.rs b/src/cargo/ops/cargo_rustc/context.rs index e17a0823b..49565ad9f 100644 --- a/src/cargo/ops/cargo_rustc/context.rs +++ b/src/cargo/ops/cargo_rustc/context.rs @@ -614,8 +614,8 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } let id = unit.pkg.package_id(); - let deps = self.resolve.deps(id); - let mut ret = deps.filter(|dep| { + let deps = self.resolve.deps_sorted(id); + let mut ret = deps.iter().filter(|dep| { unit.pkg.dependencies().iter().filter(|d| { d.name() == dep.name() && d.version_req().matches(dep.version()) }).any(|d| { @@ -748,7 +748,8 @@ impl<'a, 'cfg> Context<'a, 'cfg> { /// Returns the dependencies necessary to document a package fn doc_deps(&self, unit: &Unit<'a>) -> CargoResult>> { - let deps = self.resolve.deps(unit.pkg.package_id()).filter(|dep| { + let deps = self.resolve.deps_sorted(unit.pkg.package_id()); + let deps = deps.iter().filter(|dep| { unit.pkg.dependencies().iter().filter(|d| { d.name() == dep.name() }).any(|dep| { -- 2.30.2